import com.sun.rowset.CachedRowSetImpl;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Содержит статические методы CRUD для работы
 * с таблицой Label базы данных
 * @author tub
 */
public class Label implements MusicEntity
{
    public Label()
    {
    }

    @Override
    public String toString()
    {
        return "Label";
    }

    /**
     * Получает полные данные о лейбле
     * @param id уникальный номер строки
     * @return набор с полученной информацией о лейбле
     * @throws SQLException
     */
    public CachedRowSetImpl select(String id) throws SQLException
    {
        Connection conn = null;

        try
        {
            conn = MusicFrame.getConnection();
        }
        catch (IOException ex)
        {
             ex.printStackTrace();
        }

        String label =
        "SELECT id, title, birthday, deathday, country, parent_id, info " +
        "FROM label " +
        "WHERE id = ?";

        PreparedStatement labelStat = conn.prepareStatement(label);
        labelStat.setString(1, id);
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(labelStat.executeQuery());
        conn.close();
        
        return crs;
    }

    /**
     * Запрашивает у базы все экзепляры таблицы Label
     * @return набор ResultSet с полученной информацией обо всех лейблах
     * @throws SQLException
     */
    public CachedRowSetImpl selectAll() throws SQLException
    {
        Connection conn = null;
        
        try 
        {
            conn = MusicFrame.getConnection();
        } 
        catch (IOException ex) 
        {
             ex.printStackTrace();
        }

        String label =
        "SELECT id, title, country, parent_id, info " +
        "FROM label";

        Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(stat.executeQuery(label));
        conn.close();

        return crs;
    }


    /**
     * Получает краткие данные о лейбле
     * @param title название или часть названия без учета регистра
     * @return набор ResultSet с полученной информацией о лейбле (название и id)
     * @throws SQLException
     */
    public CachedRowSetImpl selectTitle(String title) throws SQLException
    {
        Connection conn = null;
        
        try 
        {
            conn = MusicFrame.getConnection();
        } 
        catch (IOException ex) 
        {
             ex.printStackTrace();
        }

        String label =
        "SELECT id, title" +
        " FROM label" +
        " WHERE UPPER (title) LIKE UPPER (?)";

        PreparedStatement labelStat = conn.prepareStatement(label);
        labelStat.setString(1, "%" + title + "%");
        CachedRowSetImpl crs = new CachedRowSetImpl();
        crs.populate(labelStat.executeQuery());
        conn.close();
        
        return crs;
    }

    /**
     * Метод добавляет строку в таблицу Label.
     * @param conn Соединение с базой данных
     * @param title Название лейбла
     * @param birthday Дата основания лейбла
     * @param deathday Дата закрытия лейбла
     * @param country Страна в которой базируется лейбл
     * @param parent id лейбла-родителя
     * @param info Дополнительная информация
     * @return either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
     * @throws SQLException
     */
    public int insert(String title, String birthday, String deathday, String country, String parent, String info) throws SQLException
    {
        Connection conn = null;
        
        try 
        {
            conn = MusicFrame.getConnection();
        } 
        catch (IOException ex) 
        {
             ex.printStackTrace();
        }

        String label =
        "INSERT INTO label (title, birthday, deathday, country, parent_id, info) VALUES(?, ?, ?, ?, ?, ?)";

        PreparedStatement labelStat = conn.prepareStatement(label);
        labelStat.setString(1, title);
        labelStat.setString(2, birthday);
        labelStat.setString(3, deathday);
        labelStat.setString(4, country);
        labelStat.setString(5, parent);
        labelStat.setString(6, info);

        return labelStat.executeUpdate();
    }

    /**
     * Удаляет лейбл
     * @param conn Соединение с базой
     * @param id уникальный номер строки
     * @return either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
     * @throws SQLException
     */
    public int delete(String id) throws SQLException
    {
        Connection conn = null;
        
        try 
        {
            conn = MusicFrame.getConnection();
        } 
        catch (IOException ex) 
        {
             ex.printStackTrace();
        }

        String label = "?";

        PreparedStatement labelStat = conn.prepareStatement(label);
        labelStat.setString(1, id);

        return labelStat.executeUpdate();
    }

    /**
     * Метод обновляет строку в таблице label
     * @param conn Соединение с базой данных
     * @param id Уникальный номер строки
     * @param title Название лейбла
     * @param birthday Дата основания лейбла
     * @param deathday Дата закрытия лейбла
     * @param country Страна в которой базируется лейбл
     * @param parent id лейбла-родителя
     * @param info Дополнительная информация
     * @return either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing
     * @throws SQLException
     */
    public int update(String id, String title, String birthday, String deathday, String country, String parent, String info) throws SQLException
    {
        Connection conn = null;
        
        try 
        {
            conn = MusicFrame.getConnection();
        } 
        catch (IOException ex) 
        {
             ex.printStackTrace();
        }

        String label = "?";

        PreparedStatement labelStat = conn.prepareStatement(label);
        labelStat.setString(1, id);
        labelStat.setString(2, title);
        labelStat.setString(3, birthday);
        labelStat.setString(4, deathday);
        labelStat.setString(5, country);
        labelStat.setString(6, parent);
        labelStat.setString(7, info);

        return labelStat.executeUpdate();
    }
}
